home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
ARASAN_S.ZIP
/
ATCKENTR.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-17
|
3KB
|
127 lines
// Copyright 1993 by Jon Dart. All Rights Reserved
#include "atckentr.h"
#include <stdio.h>
// data layout:
//bits
//0-1 pawn attacks
//2-3 knight attacks
//4-5 bishop attacks
//6-7 rook attacks
//8-10 queen attacks
//11 king attacks
//12-15 total # of attacks
Attack_Entry::Attack_Entry()
: info(0)
{
}
static const int16 masks[] =
{ 0, 1, 4, 0x10, 0x40, 0x100, 0x800, 0 };
static const int16 masks2[] =
{ 0, 3, 0x0c, 0x30, 0xc0, 0x700, 0x800, 0};
void Attack_Entry::add_attack(const Piece::PieceType p)
{
info += (masks[(int)p] + 0x1000);
}
void Attack_Entry::remove_attack(const Piece::PieceType p)
{
info -= (masks[(int)p] + 0x1000);
}
Piece::PieceType Attack_Entry::remove_min_attacker()
{
if (!any_attacks())
return Piece::Empty;
else if (num_attacks(Piece::Pawn))
{
remove_attack(Piece::Pawn);
return Piece::Pawn;
}
else if (num_attacks(Piece::Knight))
{
remove_attack(Piece::Knight);
return Piece::Knight;
}
else if (num_attacks(Piece::Bishop))
{
remove_attack(Piece::Bishop);
return Piece::Bishop;
}
else if (num_attacks(Piece::Rook))
{
remove_attack(Piece::Rook);
return Piece::Rook;
}
else if (num_attacks(Piece::Queen))
{
remove_attack(Piece::Queen);
return Piece::Queen;
}
else
{
remove_attack(Piece::King);
return Piece::King;
}
}
Piece::PieceType Attack_Entry::min_attacker() const
{
if (!any_attacks())
return Piece::Empty;
else if (num_attacks(Piece::Pawn))
return Piece::Pawn;
else if (num_attacks(Piece::Knight))
return Piece::Knight;
else if (num_attacks(Piece::Bishop))
return Piece::Bishop;
else if (num_attacks(Piece::Rook))
return Piece::Rook;
else if (num_attacks(Piece::Queen))
return Piece::Queen;
else
return Piece::King;
}
unsigned Attack_Entry::num_attacks() const
{
return (info & 0xf000) >> 12;
}
unsigned Attack_Entry::num_attacks(const Piece::PieceType p) const
{
int16 info2 = info & masks2[(int)p];
if (info2 == 0)
return 0;
switch (p)
{
case Piece::Pawn:
return info2;
case Piece::Knight:
return info2 >> 2;
case Piece::Bishop:
return info2 >> 4;
case Piece::Rook:
return info2 >> 6;
case Piece::Queen:
return info2 >> 8;
case Piece::King:
return 1;
default:
return 0;
}
}
ostream & operator << (ostream &o, Attack_Entry &entr)
{
char text[50];
sprintf(text,"%04x",entr.info);
o << text;
return o;
}